package ve.ucv.patologiaocular.showcase;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import ve.ucv.patologiaocular.dao.CentroDeSaludDAO;
import ve.ucv.patologiaocular.dao.CentroDeSaludDAOImpl;
import ve.ucv.patologiaocular.dao.CentroMedicoDAO;
import ve.ucv.patologiaocular.dao.CentroMedicoDAOImpl;
import ve.ucv.patologiaocular.dao.MedicoDAO;
import ve.ucv.patologiaocular.dao.MedicoDAOImpl;
import ve.ucv.patologiaocular.domain.CentroDeSalud;
import ve.ucv.patologiaocular.domain.Medico;
import ve.ucv.patologiaocular.util.ListaMedico;

import com.opensymphony.xwork2.ActionSupport;

public class ListarMedico extends ActionSupport {

	private static final long serialVersionUID = 7487844124370103371L;
	private static final Log log = LogFactory.getLog(ListarMedico.class);
	private MedicoDAO medicoDAO = null;
	private List<ListaMedico> gridModel;
	private List<Medico> medicos;
	private Integer rows = 0;
	private Integer page = 0;
	private Integer total = 0;
	private Integer records = 0;
	private boolean loadonce = false;
	private List<ListaMedico> listaMedicos; 
	private CentroMedicoDAO centroMedicoDAO = null;
	private List<CentroDeSalud> centros;
	private String centro;
	private String codigo;
	private String nombre;
	private String apellido;
	private CentroDeSalud centroDeSalud;
	private CentroDeSaludDAO centroDeSaludDAO = null;
	
	public String execute() {
		log.debug("Page " + getPage()+" Rows " + getRows());
	    this.medicoDAO = new MedicoDAOImpl();
	    this.centroMedicoDAO = new CentroMedicoDAOImpl();
	    
	    if(centro == null && codigo == null && nombre == null && apellido == null){
		    medicos = medicoDAO.listarMedicos();
		    if(medicos.size() > 0){		   
		    	listaMedicos = new ArrayList<ListaMedico>();
		    	for(Medico m : medicos){
		    		centros = centroMedicoDAO.buscarCentroDeSaludPorMedico(m.getId());
		    		if(centros.size() > 0){
		    			for(CentroDeSalud c : centros){
		    				listaMedicos.add(new ListaMedico(m.getId(), m.getCodigo(), m.getNombre(), m.getApellido(), m.getActivo(), c.getNombre(), c.getId()));
		    			}
		    		}
		    	}
		    }
	    }
	    else{
	    	if(centro.equals("-1") || centro.equals("")){
	    		medicos = medicoDAO.buscarMedico(codigo, nombre, apellido);
	    		if(medicos.size() > 0){		   
	    	    	listaMedicos = new ArrayList<ListaMedico>();
	    	    	for(Medico m : medicos){
	    	    		centros = centroMedicoDAO.buscarCentroDeSaludPorMedico(m.getId());
	    	    		if(centros.size() > 0){
	    	    			for(CentroDeSalud c : centros){
	    	    				listaMedicos.add(new ListaMedico(m.getId(), m.getCodigo(), m.getNombre(), m.getApellido(), m.getActivo(), c.getNombre(), c.getId()));
	    	    			}
	    	    		}
	    	    	}
	    	    }
	    	}
	    	else{
	    		medicos = centroMedicoDAO.buscarMedico(centro, codigo, nombre, apellido);
	    		if(medicos.size() > 0){
	    			listaMedicos = new ArrayList<ListaMedico>();
	    			this.centroDeSaludDAO = new CentroDeSaludDAOImpl();
	    			for(Medico m : medicos){
	    	    		centroDeSalud = centroDeSaludDAO.buscar(Integer.parseInt(centro));
	    	    		if(centroDeSalud != null){
    	    				listaMedicos.add(new ListaMedico(m.getId(), m.getCodigo(), m.getNombre(), m.getApellido(), m.getActivo(), centroDeSalud.getNombre(), centroDeSalud.getId()));
	    	    		}
	    	    	}
	    		}
	    	}
	    }	    
    
	    if(medicos.size() == 0){
	    	setRecords(0);
	    }
	    else{
	    	setRecords(listaMedicos.size());
	    }
	    

	    int to = (getRows() * getPage());
	    int from = to - getRows();

	    if (to > getRecords()) to = getRecords();

	    if (loadonce)
	    {
	    	if(medicos.size() == 0){
	    		setGridModel(null);
		    }
		    else{
		    	setGridModel(listaMedicos);
		    }	     	
	    }
	    else
	    {
	    	if(medicos.size() == 0){
	    		setGridModel(null);
		    }
		    else{
		    	setGridModel(listaMedicos.subList(from, to));
		    }	    	
	    }
	    
	    setTotal((int) Math.ceil((double) getRecords() / (double) getRows()));
			
		return SUCCESS;
	}

	public MedicoDAO getMedicoDAO() {
		return medicoDAO;
	}

	public void setMedicoDAO(MedicoDAO medicoDAO) {
		this.medicoDAO = medicoDAO;
	}

	public List<ListaMedico> getGridModel() {
		return gridModel;
	}

	public void setGridModel(List<ListaMedico> gridModel) {
		this.gridModel = gridModel;
	}

	public List<Medico> getMedicos() {
		return medicos;
	}

	public void setMedicos(List<Medico> medicos) {
		this.medicos = medicos;
	}
	
	public Integer getRows() {
		return rows;
	}

	public void setRows(Integer rows) {
		this.rows = rows;
	}

	public Integer getPage() {
		return page;
	}

	public void setPage(Integer page) {
		this.page = page;
	}

	public Integer getTotal() {
		return total;
	}

	public void setTotal(Integer total) {
		this.total = total;
	}

	public Integer getRecords() {
		return records;
	}

	public void setRecords(Integer records) {
		this.records = records;
		
		if (this.records > 0 && this.rows > 0)
	    {
	      this.total = (int) Math.ceil((double) this.records / (double) this.rows);
	    }
	    else
	    {
	      this.total = 0;
	    }
	}

	public boolean isLoadonce() {
		return loadonce;
	}

	public void setLoadonce(boolean loadonce) {
		this.loadonce = loadonce;
	}
	
	public List<ListaMedico> getListaMedicos() {
		return listaMedicos;
	}

	public void setListaMedicos(List<ListaMedico> listaMedicos) {
		this.listaMedicos = listaMedicos;
	}

	public CentroMedicoDAO getCentroMedicoDAO() {
		return centroMedicoDAO;
	}

	public void setCentroMedicoDAO(CentroMedicoDAO centroMedicoDAO) {
		this.centroMedicoDAO = centroMedicoDAO;
	}

	public List<CentroDeSalud> getCentros() {
		return centros;
	}

	public void setCentros(List<CentroDeSalud> centros) {
		this.centros = centros;
	}

	public String getCentro() {
		return centro;
	}

	public void setCentro(String centro) {
		this.centro = centro;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public CentroDeSalud getCentroDeSalud() {
		return centroDeSalud;
	}

	public void setCentroDeSalud(CentroDeSalud centroDeSalud) {
		this.centroDeSalud = centroDeSalud;
	}

	public CentroDeSaludDAO getCentroDeSaludDAO() {
		return centroDeSaludDAO;
	}

	public void setCentroDeSaludDAO(CentroDeSaludDAO centroDeSaludDAO) {
		this.centroDeSaludDAO = centroDeSaludDAO;
	}
}
